package com.xuecheng.manage_cms.dao;

/**
 * 懒汉式
 * @Author: Gosin
 * @Date: 2020/5/15 14:08
 */
public class Sigle2 {
    private static volatile Sigle2 sigle2;
    private Sigle2(){}

    /**
     * 锁的粒度太粗，并发的时候会影响效率问题
     * @return
     */
    /*public static synchronized Sigle2 getSigle2(){
        if(null == sigle2){
            sigle2 = new Sigle2();
        }
        return sigle2;
    }*/
    public static Sigle2 getSigle2(){
        // 这种方式，如果在高并发的情况下，会出现创建的对象不是单例的情况
        /*if(null == sigle2){
            synchronized (Sigle2.class){
                sigle2 = new Sigle2();
            }
        }*/

        // 在判断条件上面加锁，这种方式太影响性能，100个线程都需要过来争夺锁资源对象，如果已经创建单例，白争抢
        /*synchronized (Sigle2.class){
            if(null == sigle2){
                synchronized (Sigle2.class){
                    sigle2 = new Sigle2();
                }
            }
        }
        */

        // 使用DCL的方式，不需要所有的线程都去争抢这个锁资源对象，如果有线程执行完了之后，就会将一些未进入第一个判断条件的线程拦截，提升效率，
        // 空间换时间的思想
        if(null == sigle2){
            synchronized (Sigle2.class){
                if(null == sigle2){
                    sigle2 = new Sigle2();
                }
            }
        }
        return sigle2;
    }
}
